-- 抢券lua实现
-- key: 抢券同步队列, 资源库存, 抢券成功列表
-- argv：活动id, 用户id

-- 优惠券是否已经抢过
local couponNum = redis.call("HGET", KEYS[3], ARGV[2])
-- hget 获取不到数据返回false而不是nil
if couponNum ~= false and tonumber(couponNum) >= 1
then
    return "-1"; -- 已抢卷
end
-- 库存是否充足校验
local stockNum = redis.call("HGET", KEYS[2], ARGV[1])
if stockNum == false or tonumber(stockNum) < 1
then
    return "-2"; -- 库存不足抢卷失败
end
-- 抢券成功列表
local listNum = redis.call("HSET", KEYS[3], ARGV[2], 1)
if listNum == false or tonumber(listNum) < 1
then
    return "-3"; -- 写入抢卷成功列表失败
end
-- 减少库存
stockNum = redis.call("HINCRBY", KEYS[2], ARGV[1], -1)
if tonumber(stockNum) < 0
then
    return "-4" -- 库存不足抢卷失败
end
-- 抢卷结果写入同步队列
local result = redis.call("HSETNX", KEYS[1], ARGV[2], ARGV[1])
if result > 0
then
    return "100" -- 抢卷成功返回活动id
end
return "-5" -- 写入同步队列失败